package com.fy.fyai.service.downloaddecorator.factory;

import com.fy.fyai.service.downloaddecorator.DownloadComponent;
import com.fy.fyai.service.downloaddecorator.component.BaseDownload;
import com.fy.fyai.service.downloaddecorator.constant.RateLimitConstant;
import com.fy.fyai.service.downloaddecorator.decorator.rate.RateLimitDecorator;
import com.fy.fyai.service.downloaddecorator.enums.UserTypeEnum;
import com.fy.fyai.service.downloaddecorator.rate.RateLimiter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import jakarta.annotation.Resource;

/**
 * @author fwq
 * @description 下载装饰器工厂（根据用户类型创建装饰器链）
 * @date 2025-11-03 20:20
 */
@Slf4j
@Component
public class DownloadDecoratorFactory {

    @Resource
    private BaseDownload baseDownload;
    
    @Resource
    private RateLimiter rateLimiter;

    /**
     * 根据用户类型创建对应的下载组件（装饰器链）
     * 
     * @param userTypeEnum 用户类型枚举
     * @return 配置好的下载组件（可能包含装饰器链）
     */
    public DownloadComponent createDownloadComponent(UserTypeEnum userTypeEnum) {
        // 从基础下载组件开始
        DownloadComponent component = baseDownload;

        // 根据用户类型动态添加装饰器
        switch (userTypeEnum) {
            case SVIP:
                // SVIP：基础下载 -> 限流装饰器（20MB/秒）
                component = new RateLimitDecorator(
                    component, 
                    RateLimitConstant.SVIP_RATE_LIMIT_BYTES_PER_SECOND,
                    rateLimiter
                );
                log.debug("创建SVIP下载装饰器链（限流: {} bytes/秒）", RateLimitConstant.SVIP_RATE_LIMIT_BYTES_PER_SECOND);
                break;
            case VIP:
                // VIP：基础下载 -> 限流装饰器（10MB/秒）
                component = new RateLimitDecorator(
                    component, 
                    RateLimitConstant.VIP_RATE_LIMIT_BYTES_PER_SECOND,
                    rateLimiter
                );
                log.debug("创建VIP下载装饰器链（限流: {} bytes/秒）", RateLimitConstant.VIP_RATE_LIMIT_BYTES_PER_SECOND);
                break;
            case NORMAL:
            default:
                // 普通用户：仅基础下载（不限流）
                log.debug("创建普通用户下载组件（不限流）");
                break;
        }

        return component;
    }
}
